/* 砸壳
1.砸壳原理
 1.1 应用加壳
 1.2 应用砸壳
 1.3 静态砸壳
 1.4 动态砸壳
 1.5 iOS应用运行原理
 
2.工具使用
  Clutch、dumpdecrypted、frida-iOS-dump
 2.1 Clutch
  使用方法参见 ppt
 
  插入动态库
    1.DYLD_INSERT_LIBRARIES环境变量 dyld加载流程
    2.创建自定义动态库，添加一句输出打印
    3.将动态库拷贝到家目录
    4.使动态库执行，DYLD_INSERT_LIBRARIES 环境变量可以使动态库附加到某个应用中执行
    5.ps -A // 看到当前有哪些进程
    6.找到当前的进程，DYLD_INSERT_LIBRARIES=动态库的可执行文件 依附的进程
    7.点击回车（执行）
 
 2.2 dumpdecrypted
    简介：ppt
  2.2.1 拷贝到手机中，家目录下
  2.2.2 DYLD_INSERT_LIBRARIES=动态库的文件 依附的进程
  2.2.3 ls 命令查看 多出了 *.decrypted ,这种方式只获取可执行文件
  2.2.4 将文件拷出到桌面 使用 otools -l keep.decrypted | grep crypt
 
 2.3 frida-iOS-dump
    简介
   2.3.1 安装frida(手机和mac电脑都需要安装) 参见ppt
   2.3.2 参照 ppt安装 frida
 
   frida-ps -U   // 查看手机中的进程
   frida-ps      // 查看当前进程
   frida -U 微信  // 附加到微信 使用ObjC获取微信的所有对象
 
   2.3.3 mac 配置ios-dump
    参照ppt
    
   2.3.4 使用
    1.修改 dump.py 的port 默认是2222，需要改成我们自己的
    2.usb连接手机
    3. ./dump.py 微信 （注意：这里要保持应用在运行的状态）
    4.使用脚本 ，将命令写入脚本中
 
 3. Cycript 使用
    默认手机越狱后中文输入有问题，我们需要将.inputrc文件导入到手机中
 
    vi 文件名 //查看文件
    scp -P 12345 .inputrc root@localhost:~
    ls -a // 查看文件
  安装 vim 插件 （有时我们需要在手机中创建文件等，需要使用到vim，这时会报找不到命令）
    手机安装Vi IMproved
    手机安装adv-cmds
    手机安装Cycript
 
 Cycript 依附调试微信 （这里是在命令行调试的手机微信）
  ps -A               // 找到所有进程
  ps -A | grep WeChat // 找到微信
  cycript -p WeChat/进程号 // 进入Cy
    UIApp
    UIApp.keyWindow.rootViewController.view.recursiveDescription()
    UIApp.keyWindow.rootViewController.view.recursiveDescription().toString()  // 查看微信的图层
    
 越狱中导入cy文件
    cycript 可文件在手机 /usr/bin路径下，执行命令的时候执行这个
    
    /usr/lib/cycript0.9 这个文件夹下放的是cycript的其它（自定义函数）文件等
    我们将之前的*.cy 问价拷贝到 /usr/lib/cycript0.9文件夹中
    scp -P 12345 czera.cy root@localhost:/usr/lib/cycript0.9
 
    回到当前设备的根目录
    依附某一个应用 比如微信：cycript -p WeChat
    @import czera
    CZcurrentVC() // czrea中的函数，输出当前的控制器名称
 
    注意：我们一般不会把我们自己的文件放在 cycript0.9 的根目录下，因为每个文件的功能不同，所以我们一般把他们打包到com问价夹下的某一组织或者个人文件夹
    使用：
        cycript -p WeChat
        @import com.czeras.czera
        CZcurrentVC()
 
 4. theos配置
    theos 简介
    安装方法见github https://www.jianshu.com/p/6fb091c8c5cd
                   https://www.jianshu.com/p/751444520848
    由于我目前电脑中的环境没有配置正确。所以我使用的时候是在当前文件夹下 /opt/theos/bin/nic.pl
 
 5.实战 调试支付宝 17716435945
    1.映射接口 & 登录越狱手机
    2.找到支付宝 ps -A ｜ grep Ali
    3.cycript -p AlipayWallet
    4.@import com.czeras.czera
    5.CZCurrentVC() // 找到当前的控制器
        #"<ALULoginContainerController: 0x13821e620>"
    6. #0x13821e620.view.recursiveDescription().toString()
    再结果中搜索 我们在输入框输入的内容，找到当前的密码框 aluTextField 类,登录按钮所属哦的类
    注意：我们在第6步获取的数据，我们可以搜索`登录`这两个汉字的unicode编码确定按钮
    7.打开 http://tool.chinaz.com/tools/unicode.aspx 登录 中文转 unicode,再结果中搜索，找到AUButton
    8.登录按钮的 #0x138bb9460.allTargets(),找到登录按钮的所有targets
        类ALUAccuratePWDView中有按钮的响应方法
        通过苹果的api找到 方法如下：
            #0x138bb9460.allControlEvents() // 找到 events，64表示单击事件
        找到按钮的方法：
            [#0x138bb9460 actionsForTarget:#0x138bab030 forControlEvent:64]
          输出：onNext 方法
    9.砸壳，拿到头文件
        1. frida-ps -U // 找到支付宝
        2. sh ./dumpIPA.sh 支付宝 // 执行命令注意当前文件夹有没有权限
        3. class-dump 头文件
            class-dump -H AlipayWallet -o /Users/czera/Desktop/test_ALIPAY/AlipayWalletHeaders
        4. 然后我们再分析它的头文件
            1.查找 ALUAccuratePWDView 类 ，然后找 onNext方法
            2.当前类中没有和密码相关的内容，我们依旧使用静态分析方法去读取，但是今天我们不这样干
            3.现在我们要找 ALUAccuratePWDView 和登录(AUButton)按钮、密码框的关系
            4.发现 登录按钮、账号、密码视图 平级，密码视图(aluAccurateLoginBox)包含aluInputBox包含密码框
                注意：这里其实就是找两个控件的公共父类，从而获取到密码框的对象。不同app版本的App视图层级不同，需要自己分析
               图： 实战-调试支付宝-登录层级视图.png
            5.通过 subviews() 拿到密码框 #0x138bab030(ALUAccuratePWDView*).subviews()[0].subviews()[0].subviews()[1].text
 
 6.theos 实现支付宝密码窃取
    1.进入到放代码的文件夹下，执行 theos的nic.pl命令
    2.选择列表中 tweak选项。（输入数字）
    3.输入工程名称 AliPayPwdDemo
    4.输入标识 com.czeras.alipaypwddemo (注意全部小写)
    5.作者
    6.需要依赖的库的id，com.alipay.iphoneclient (在越狱手机环境中获取)
    7.直接回车
    8.在当前目录下会生成 alipaypwddemo 项目，有4个文件，分别是AliPayPwdDemo.plist、control、Makefile、Tweak.x
    9.在 Tweak.x 添加 以下代码：
        #import <UIKit/UIKit.h>

        %hook ALUAccuratePWDView
        - (void)onNext{

             // 这里subviews 是根据 cy# 视图层级结构分析出来的
             NSString *pwdStr = self.subviews()[0].subviews()[0].subviews()[1].text

             [[[UIAlertView alloc]
                initWithTitle:@"密码是"
                message:pwdStr
                delegate:nil
                cancelButtonTitle:@"cancle"
                otherButtonTitles:nil, nil] show];
        }
        %end
    10.在当前项目目录下执行 make。（如果报错参照网络上解决方法）
    11.make packge; make install
    12.输入账号密码，获取到当前输入的密码
    13.在cydia中卸载我们插件就可以了
 注意：在实际的开发中我们需要判断版本、手机型号、等。
*/
